#### softmax层和Loss层一起实现，哦哦原来选择softmax函数作为输出层的激活函数
#### 选择交叉熵误差（cross_entropy_error）作为损失函数
#### 这一切并不是巧合，而是为了在计算图设计中，得到一个漂亮的反向传值（y1 - t1)
#### 原来在这里，就一切都不是巧合
import sys,os

import numpy as np

sys.path.append(os.pardir)
from common.functions import *


class SoftmaxWithLoss:
    def __init__(self):
        self.loss = None  # 损失函数值
        self.y = None  # softmax的输出
        self.t = None  # 监督数据（one-hot-vector)

    # 激活函数softmax
    def softmax(self, x):
        x = x - np.max(x)
        return np.exp(x) / np.sum(np.exp(x))

    # 损失函数 cross_entropy_error



    # forward
    def forward(self, x, t):
        self.t = t
        self.y = self.softmax(x)
        self.loss = cross_entropy_error(self.y, self.t)
        return self.loss

    # backward
    def backward(self, dout=1):
        batch_size = self.t.shape[0]
        dx = (self.y - self.t) / batch_size
        return dx